import 'package:flutter/material.dart';
import 'dart:async';
import 'dart:math' as math;

/// Elegance控件库的工具类
/// 
/// 这个文件定义了常用的工具方法，提供尺寸计算、颜色处理、动画辅助等功能

/// Elegance工具类
/// 
/// 提供各种常用的工具方法
class EleganceUtils {
  /// 私有构造函数，防止实例化
  EleganceUtils._();

  /// 计算响应式尺寸
  /// 
  /// [context] 构建上下文
  /// [designSize] 设计稿中的尺寸
  /// [baseWidth] 设计稿的基准宽度，默认为375.0（iPhone 6/7/8的宽度）
  static double responsiveSize(
    BuildContext context,
    double designSize,
    [double baseWidth = 375.0]
  ) {
    final screenWidth = MediaQuery.of(context).size.width;
    return designSize * (screenWidth / baseWidth);
  }

  /// 计算响应式字体大小
  /// 
  /// [context] 构建上下文
  /// [designSize] 设计稿中的字体大小
  /// [minSize] 最小字体大小
  /// [maxSize] 最大字体大小
  static double responsiveFontSize(
    BuildContext context,
    double designSize,
    {double? minSize, double? maxSize}
  ) {
    final size = responsiveSize(context, designSize);
    if (minSize != null && size < minSize) return minSize;
    if (maxSize != null && size > maxSize) return maxSize;
    return size;
  }

  /// 颜色透明度调整
  /// 
  /// [color] 原始颜色
  /// [opacity] 透明度，范围0.0-1.0
  static Color withOpacity(Color color, double opacity) {
    return color.withOpacity(opacity);
  }

  /// 颜色亮度调整
  /// 
  /// [color] 原始颜色
  /// [factor] 亮度因子，大于1.0变亮，小于1.0变暗
  static Color adjustBrightness(Color color, double factor) {
    final hsl = HSLColor.fromColor(color);
    final newLightness = math.min(1.0, math.max(0.0, hsl.lightness * factor));
    return hsl.withLightness(newLightness).toColor();
  }

  /// 颜色饱和度调整
  /// 
  /// [color] 原始颜色
  /// [factor] 饱和度因子，大于1.0增加饱和度，小于1.0降低饱和度
  static Color adjustSaturation(Color color, double factor) {
    final hsl = HSLColor.fromColor(color);
    final newSaturation = math.min(1.0, math.max(0.0, hsl.saturation * factor));
    return hsl.withSaturation(newSaturation).toColor();
  }

  /// 颜色混合
  /// 
  /// [color1] 第一个颜色
  /// [color2] 第二个颜色
  /// [weight] 第一个颜色的权重，范围0.0-1.0
  static Color mixColors(Color color1, Color color2, double weight) {
    final w = weight.clamp(0.0, 1.0);
    final inverseWeight = 1.0 - w;
    
    return Color.fromARGB(
      ((color1.a * w + color2.a * inverseWeight) * 255.0).round() & 0xff,
      ((color1.r * w + color2.r * inverseWeight) * 255.0).round() & 0xff,
      ((color1.g * w + color2.g * inverseWeight) * 255.0).round() & 0xff,
      ((color1.b * w + color2.b * inverseWeight) * 255.0).round() & 0xff,
    );
  }

  /// 格式化数字为带千分位的字符串
  /// 
  /// [number] 要格式化的数字
  static String formatNumber(double number) {
    return number.toStringAsFixed(0).replaceAllMapped(
      RegExp(r'\B(?=(\d{3})+(?!\d))'),
      (match) => ',',
    );
  }

  /// 检查字符串是否为空
  /// 
  /// [value] 要检查的字符串
  static bool isEmpty(String? value) {
    return value == null || value.isEmpty;
  }

  /// 检查字符串是否不为空
  /// 
  /// [value] 要检查的字符串
  static bool isNotEmpty(String? value) {
    return value != null && value.isNotEmpty;
  }

  /// 安全地解析整数
  /// 
  /// [value] 要解析的字符串
  /// [defaultValue] 解析失败时的默认值
  static int? tryParseInt(String? value, [int? defaultValue]) {
    if (value == null) return defaultValue;
    final result = int.tryParse(value);
    return result ?? defaultValue;
  }

  /// 安全地解析浮点数
  /// 
  /// [value] 要解析的字符串
  /// [defaultValue] 解析失败时的默认值
  static double? tryParseDouble(String? value, [double? defaultValue]) {
    if (value == null) return defaultValue;
    final result = double.tryParse(value);
    return result ?? defaultValue;
  }

  /// 防抖函数
  /// 
  /// [callback] 要执行的回调函数
  /// [delay] 延迟时间（毫秒）
  static Function debounce(Function callback, [int delay = 300]) {
    Timer? timer;
    
    return () {
      if (timer != null) {
        timer!.cancel();
      }
      timer = Timer(Duration(milliseconds: delay), () {
        callback();
      });
    };
  }

  /// 节流函数
  /// 
  /// [callback] 要执行的回调函数
  /// [delay] 节流时间（毫秒）
  static Function throttle(Function callback, [int delay = 300]) {
    bool isThrottled = false;
    
    return () {
      if (!isThrottled) {
        isThrottled = true;
        callback();
        
        Future.delayed(Duration(milliseconds: delay), () {
          isThrottled = false;
        });
      }
    };
  }

  /// 随机生成指定范围内的整数
  /// 
  /// [min] 最小值（包含）
  /// [max] 最大值（包含）
  static int randomInt(int min, int max) {
    final random = math.Random();
    return min + random.nextInt(max - min + 1);
  }

  /// 随机生成颜色
  static Color randomColor() {
    final random = math.Random();
    return Color.fromRGBO(
      random.nextInt(256),
      random.nextInt(256),
      random.nextInt(256),
      1.0,
    );
  }

  /// 计算两点之间的距离
  /// 
  /// [x1] 第一个点的x坐标
  /// [y1] 第一个点的y坐标
  /// [x2] 第二个点的x坐标
  /// [y2] 第二个点的y坐标
  static double distance(double x1, double y1, double x2, double y2) {
    final dx = x2 - x1;
    final dy = y2 - y1;
    return math.sqrt(dx * dx + dy * dy);
  }

  /// 角度转弧度
  /// 
  /// [degrees] 角度值
  static double degreesToRadians(double degrees) {
    return degrees * math.pi / 180.0;
  }

  /// 弧度转角度
  /// 
  /// [radians] 弧度值
  static double radiansToDegrees(double radians) {
    return radians * 180.0 / math.pi;
  }
}

/// 扩展类，提供便捷的工具方法
extension EleganceUtilsExtension on BuildContext {
  /// 获取响应式尺寸
  double responsiveSize(double designSize, [double baseWidth = 375.0]) {
    return EleganceUtils.responsiveSize(this, designSize, baseWidth);
  }

  /// 获取响应式字体大小
  double responsiveFontSize(
    double designSize,
    {double? minSize, double? maxSize}
  ) {
    return EleganceUtils.responsiveFontSize(this, designSize, minSize: minSize, maxSize: maxSize);
  }
}